/**
 * @description: 数字处理函数工具类
 * @author: lxz
 * @update: lxz(2021-01-18)
 */

const numToUnit = [
	{ value: 1e8, symbol: '亿' },
	{ value: 1e4, symbol: '万' }
	// { value: 1E3, symbol: '千' }
]
/**
 * 数字转整数
 * like 100000 转为10万
 * @param {number|string} num   需要转化的数
 * @param {number} digits        需要保留的小数位数
 * @return {string}             转换后的字符串
 */
export function tranNumber(num, digits = 2, numUnitSplit) {
	if (num === 0 || !num) return numUnitSplit ? { num: 0, unit: '' } : 0
	if (isNaN(Number(num))) return num

	let unitStr = ''
	for (let i = 0; i < numToUnit.length; i++) {
		if (num >= numToUnit[i].value) {
			num = num / numToUnit[i].value
			unitStr = numToUnit[i].symbol + unitStr
		}
	}
	const n = (num / 1).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1')
	return numUnitSplit ? { num: n, unit: unitStr } : n + unitStr
}

/**
 * 数字文字 转 数字
 * like 10万 转为 100000
 * @param {string} str          需要转化的数字文字
 * @return {number}}            数字
 */
export function numStrToNum(str) {
	if (typeof str !== 'string') return str
	let multiplier = 1
	numToUnit.forEach(v => {
		if (~str.indexOf(v.symbol)) multiplier *= v.value
	})
	return parseFloat(str) * multiplier
}

/**
 * 亿元转数字再转数字单位
 * like 0.001亿 => 10万
 * @param {number} num     数字
 * @param {number} digits  小数点保留位数
 */
export function hundredMillionFormatter(num, digits = 2, numUnitSplit, isSmall) {
	if (num === 0 || !num) return numUnitSplit ? { num: 0, unit: '' } : 0
	if (isNaN(Number(num))) return num

	let unit = '亿'

	if (isSmall && num < 1) {
		// 数字较小的转为制定数字单位
		const numEl = tranNumber(numStrToNum(num + unit), 2, true)
		unit = numEl.unit || ''
		num = numEl.num
	}

	const n = (num / 1).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1')
	return numUnitSplit ? { num: n, unit } : n + unit
}

/**
 * 数字加顿号
 * like 10000 => "10,000"
 * @param {number|string} num   需要转化的数
 * @return {string}             转换后的字符串
 */
export function numAddComma(num) {
	return (+num || 0).toString().replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))
}

/**
 * 转百分比
 * like 0.4 => 40%
 * @param {number} num     数字
 */
export function toPercentage(num, needSymbol = true) {
	if (typeof num !== 'number') {
		const num2 = parseFloat(num)
		if (isNaN(num2)) return num
		num = num2
	}
	num = Math.round(num * 10000) / 100
	return needSymbol ? num + '%' : num
}

/**
 * 保留几位有效数字
 * @param {Number}   num   转换数字
 * @param {Number}   point 保留位数
 * @return {Number}        处理后的数字
 */
export function numberPoint(num, point = 2) {
	const cnum = Math.pow(10, point)
	return Math.floor(num * cnum) / cnum
}
